package com.zzg.datastructure.spasearray;

/**
 * @Author zhengzg
 * @Date 2022-08-16
 * @Version v1.0
 */
public class SparseArray {

    public static void main(String[] args) {

        // 创建一个原始的二维数组 11*11
        // 0 表示没有棋子，1 表示黑子，2 表示蓝子
        int[][] chessArr = new int[11][11];
        chessArr[1][2] = 1;
        chessArr[2][3] = 2;
        chessArr[4][5] = 2;

        // 输出原始的二维数组
        System.out.println("《=========原始的二维数组========》");
        for (int[] row : chessArr){
            for (int data : row){
                System.out.printf("%d\t",data);
            }
            //换行
            System.out.println();
        }

        /*
         * 将二维数组转化稀疏数组思路
         * 1. 先遍历二维数组，找出非0数据的个数
         * 2. 创建对应的稀疏数组
         * 3. 遍历二维数组，将非0的值存放到sparseArr中
         */
        int sum = 0; //记录非0数据个数
        for (int[] row : chessArr){
            for (int data : row){
                if (data != 0){
                    sum++;
                }
            }
        }

        /*
         * sum: 决定数据的行数
         * +1: 第一行记录原数组总行数与总列数，以及非0数据总数
         * 第一列：记录数据的横坐标
         * 第二列：记录数据的纵坐标
         * 第三列：记录数据
         */
        int[][] sparseArr = new int[sum + 1][3];
        // 对稀疏数组进行赋值
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;

        // 遍历二维数组将数据放入稀疏数组
        int count = 0; // 用于记录第几个非0数据
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr[i][j] != 0){
                    count++;
                    // 第一列：放入行数
                    sparseArr[count][0] = i;
                    // 第二列：放入列数
                    sparseArr[count][1] = j;
                    // 第三列：放入数据
                    sparseArr[count][2] = chessArr[i][j];
                }
            }
        }

        // 输出稀疏数组
        System.out.println("《=============输入稀疏数组===========》");
        for (int[] ints : sparseArr) {
            System.out.printf("%d\t%d\t%d\t\n", ints[0], ints[1], ints[2]);
        }
        System.out.println();

        /*
         * 将稀疏数组还原为原二维数组
         * 1. 读取稀疏数组第一行，得到二维数组的行列，数据
         * 2. 将稀疏数组数据赋值给二维数组
         */
        changeSparseArrToChessArr(sparseArr);
    }

    private static void changeSparseArrToChessArr(int[][] sparseArr) {
        // 1. 遍历稀疏数组,获取行列
        int[][] chessArr = new int[sparseArr[0][0]][sparseArr[0][1]];

        // 2. 遍历赋值
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

        //输入遍历后的二维数组
        System.out.println("《=================恢复后的二维数组==============》");
        for (int[] row : chessArr){
            for (int data : row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
    }
}
